library(tidyverse)
<- matrix(c(1.0, 0.6, 0.6,
Sigma 0.6, 1.0, 0.0,
0.6, 0.0, 1.0),
nrow = 3)
<- MASS::mvrnorm(n = 1000,
data mu = rep(0,3),
Sigma = Sigma,
empirical = T) %>% as.data.frame()
Simulate Data
We’ll simulate a tri-variate data set, with two uncorrelated variables that are correlated to a third variable. To start, all variables will be centered at 0 (mu
) and scaled to 1 (diagonal of Sigma
):
Let’s re scale V2
to increase it’s slope when predicting V1
:
<- data %>%
data mutate(V2 = 5*V2+10)
Lets look at the correlation matrix (should be the same as Sigma
):
::kable(cor(data)) knitr
V1 | V2 | V3 | |
---|---|---|---|
V1 | 1.0 | 0.6 | 0.6 |
V2 | 0.6 | 1.0 | 0.0 |
V3 | 0.6 | 0.0 | 1.0 |
and the covariance matrix (should only be different in the scale of V2
):
::kable(cov(data)) knitr
V1 | V2 | V3 | |
---|---|---|---|
V1 | 1.0 | 3 | 0.6 |
V2 | 3.0 | 25 | 0.0 |
V3 | 0.6 | 0 | 1.0 |
Fit lavaan
model
library(lavaan)
<- '
my_model V1 ~ a*V2 + b*V3
diff := a - b
'
<- sem(my_model, data = data) fit
If diff
is computed on the standardized coefficients, we expect it to be 0.
If diff
is computed on the unstandardized coefficients, we expect it to not 0.
summary(fit, standardized = T)
lavaan 0.6.13 ended normally after 1 iteration
Estimator ML
Optimization method NLMINB
Number of model parameters 3
Number of observations 1000
Model Test User Model:
Test statistic 0.000
Degrees of freedom 0
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Regressions:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
V1 ~
V2 (a) 0.120 0.003 35.857 0.000 0.120 0.600
V3 (b) 0.600 0.017 35.857 0.000 0.600 0.600
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.V1 0.280 0.013 22.361 0.000 0.280 0.280
Defined Parameters:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
diff -0.480 0.017 -28.128 0.000 -0.480 0.000
We can see that the Estimate
of diff
is non-zero, implying that it was computed on the non-standardized coefficients. BUT we also see that the Std.all
of diff
is 0, implying that it was computed on the standardized coefficients.
What about the significance test?
parameterEstimates(fit)[7,] %>% knitr::kable()
lhs | op | rhs | label | est | se | z | pvalue | ci.lower | ci.upper | |
---|---|---|---|---|---|---|---|---|---|---|
7 | diff | := | a-b | diff | -0.48 | 0.0170646 | -28.12843 | 0 | -0.513446 | -0.446554 |
standardizedSolution(fit)[7,] %>% knitr::kable()
lhs | op | rhs | label | est.std | se | z | pvalue | ci.lower | ci.upper | |
---|---|---|---|---|---|---|---|---|---|---|
7 | diff | := | a-b | diff | 0 | 0.0236643 | 0 | 1 | -0.0463812 | 0.0463812 |
We can see that we get two different \(z\)-tests, depending on the type of estimates we get. It seems that the test results returned from summary()
are based on the standardizedSolution()
function, and thus based on the unstandardized results.